package com.hujie.sqlqueryes.service;

import com.hujie.sqlqueryes.dto.DslResultDTO;
import com.hujie.sqlqueryes.service.impl.SqlPreprocessorImpl;
import com.hujie.sqlqueryes.service.sql.SqlStatementHandler;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class SqlToDslConverterService {
    
    private static final Logger logger = LoggerFactory.getLogger(SqlToDslConverterService.class);
    
    @Autowired
    private SqlPreprocessorImpl sqlPreprocessor;
    
    @Autowired
    private List<SqlStatementHandler> statementHandlers;
    
    public DslResultDTO convertSqlToDsl(String sql) {
        try {
            logger.info("开始转换SQL到DSL: {}", sql);
            
            // 预处理SQL，自动为包含特殊字符的表名添加方括号
            String processedSql = sqlPreprocessor.preprocessSql(sql);
            logger.debug("预处理后的SQL: {}", processedSql);
            
            // 使用宽松模式解析SQL，以支持特殊字符的表名
            Statement statement = CCJSqlParserUtil.parse(processedSql, parser -> parser.withSquareBracketQuotation(true));
            
            // 查找并使用合适的处理器
            for (SqlStatementHandler handler : statementHandlers) {
                if (handler.supports(statement)) {
                    logger.debug("找到合适的处理器: {}", handler.getClass().getName());
                    DslResultDTO result = handler.handle(statement);
                    logger.info("处理结果 - 成功: {}, DSL: {}", result.isSuccess(), result.getDsl());
                    return result;
                }
            }
            
            logger.warn("不支持的SQL语句类型");
            return DslResultDTO.error("不支持的SQL语句类型");
            
        } catch (JSQLParserException e) {
            logger.error("SQL解析错误: {}", e.getMessage(), e);
            return DslResultDTO.error("SQL解析错误: " + e.getMessage());
        } catch (Exception e) {
            logger.error("转换过程中发生错误: {}", e.getMessage(), e);
            return DslResultDTO.error("转换过程中发生错误: " + e.getMessage());
        }
    }
}